package netty.ProtoBuf.codec2;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;
import netty.ProtoBuf.codec.StudentPOJO;

;

/**
 * @ClassName ServerHandler
 * @Description TODO
 * @Author director吴
 * @Date 2022/1/19 12:56
 * @Version 1.0
 *
 *  ****   自定义handler需要继承netty指定的 handler 适配器，此时我们定义handler 才能被纳入到netty的 handler 工作组中
 *
 **/
//public class ServerHandler extends ChannelInboundHandlerAdapter {


    /*
    1.继承  ChannelInboundHandlerAdapter  实现 channelRead方法   channelRead方法  使用object类接消息
    2.继承  SimpleChannelInboundHandler  实现 channelRead0方法  channelRead0方法  使用指定的泛型类型接收消息 如<StudentPOJO.Student>
     */

public class ServerHandler extends SimpleChannelInboundHandler<MyDataInfo.MyMessage> {


    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, MyDataInfo.MyMessage myMessage) throws Exception {

        //更具data_type 显示不同信息
        MyDataInfo.MyMessage.DataType dataType = myMessage.getDataType();

        if (dataType == MyDataInfo.MyMessage.DataType.StudentType){

            MyDataInfo.Student student = myMessage.getStudent();
            System.out.println("student id =" + student.getId() + "student name =" + student.getName());

        }else if(dataType == MyDataInfo.MyMessage.DataType.WorkerType){

            MyDataInfo.Worker worker = myMessage.getWorker();
            System.out.println("worker age =" + worker.getAge() + "worker name =" + worker.getName());

        }else {

            System.out.println("传输的数据类型不正确！");
        }


    }





    /**   数据读取完毕---  回复消息
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        /*
        ChannelHandlerContext  的写入方法  有
                  ctx.writeAndFlush ()   ----写入到 【缓存区域】并  【刷新】--刷新就是将缓存的属性再写入到管道
                  ctx.write()           ----写入   【缓存区域】，并没有将数据刷新到管道
         */


        //需要对发送的数据进修编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端", CharsetUtil.UTF_8));
    }




    /**   异常处理
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
